#ifndef SERIAL_PORT_INCLUDE_DEF
#define SERIAL_PORT_INCLUDE_DEF

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "string.h"

#define REC_BUF_MAX 1024

/**
 * @brief 串口类
 *
 */
class SerialPort
{
public:
    /**
     * @brief Construct a new Serial Port:: Serial Port object
     *
     * @param port 端口号
     * @param config 端口配置信息
     * @param tx_io_num TX脚定义
     * @param rx_io_num RX脚定义
     */
    SerialPort(uart_port_t port, uart_config_t config, int tx_io_num, int rx_io_num);
    /**
     * @brief Destroy the Serial Port:: Serial Port object
     *
     */
    virtual ~SerialPort();

    /**
     * @brief 添加数据到接收缓存
     *
     * @param buf 要添加的数据
     * @param len 要添加的长度
     */
    void appendRecBuf(unsigned char *buf, int len);
    /**
     * @brief 删除数据缓冲区数据
     *
     * @param len 要删除的数据长度
     */
    void decRecBuf(int len);
    /**
     * @brief 读取内容到缓存
     *
     * @return int 读取到的数据长度
     */
    int read();
    /**
     * @brief 发送数据
     *
     * @param buf 要发送的数据缓存
     * @param len 长度
     */
    void write(unsigned char *buf, int len);

    /**
     * @brief 获取数据缓存
     * 
     * @return unsigned char* 
     */
    unsigned char *getBuf()
    {
        return m_buf;
    }

    /**
     * @brief 获取数据缓存长度
     * 
     * @return int 长度
     */
    int getBufLen() const
    {
        return m_buf_len;
    }

private:
    /**
     * @brief 端口
     * 
     */
    uart_port_t m_port;
    /**
     * @brief 数据缓存
     * 
     */
    unsigned char* m_buf;
    /**
     * @brief 数据缓存中的有效长度
     * 
     */
    int m_buf_len;
};
#endif
